package inner;

import com.sun.org.apache.bcel.internal.generic.NEW;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

/**
 * Created with IntelliJ IDEA.
 * Description：
 * User：user
 * DATE:2021-11-14
 * Time:9:21
 */

/*
本地内部类:用的非常少，在方法里边定义类
以后说内部类的时候一定要带上前缀
实例内部类：
静态内部类：
匿名内部类：
 */
/*
class OutClass{
    public int data1 = 1;
    private  int data2 = 2;
    public static  int data3 =3;
   */
/* public void func(){
        static final  int a = 10;错误写法只能在类的内部进行定义
    }*//*

    */
/*
    实例内部类[实例的“成员”]
    1.在实例内部类当中，为什么不能定义静态的成员变量？语法不支持，需要定义一个在编译时期就确定的
    2. 获取实例内部类的方式
       OutClass outClass = new OutClass();
       OutClass.InnerClass inneeClass = outClass.new InnerClass();
    3.实例内部类当中，会包含外部类的this   System.out.println(OutClass.this.data1);
    4.生成的实例内部类，类名是外部类$内部类类名.class
     *//*


    class InnerClass{
        public int data1 = 99;
        public  int data4 = 4;
        private  int data5 = 5;
        public static  final int data6 = 6;//定义静态可以必须是final修饰的
        public OutClass out = new OutClass();
        public void func(){
            System.out.println("InnerClass::func()");
            System.out.println(data1);
            System.out.println(this.data1);//内部类的this
            System.out.println(out.data1);
            System.out.println(OutClass.this.data1);//外部类类名.this访问外部类的成员变量
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }

}
*/

class OutClass{
    public int data1 = 1;
    private  int data2 = 2;
    public static  int data3 =3;

    /*
    静态内部类[静态的“成员”]
    1.如何获取静态内部类的实例对象4
    OutClass.InnerClass  innerClass = new OutClass.InnerClass();
    2.如何访问静态内部类当中，外部类的实例数据成员
    3.
     */
    static class InnerClass{
        public int data1 = 99;
        public  int data4 = 4;
        private  int data5 = 5;
        public static  final int data6 = 6;//定义静态可以必须是final修饰的
        public OutClass out = new OutClass();
        public void func(){
            System.out.println("InnerClass::func()");
            System.out.println(data1);
            System.out.println(this.data1);//内部类的this
            System.out.println(out.data1);
            System.out.println(out.data2);
            //System.out.println(OutClass.this.data1);无法访问 外部类的this
            //System.out.println(data2); 外部类的成员this也不能访问
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }

}
class Out{
    public void func(){
        System.out.println("out::func()!");
    }
}
public class Test {

    public static void main(String[] args) {
        //new Out();//匿名对象
        int b  = 199;
        new Out(){
            int a = 10;
            //a = 99;
            //b = 66;
            //变量的捕获  一定是没有被修改过的量
            public  void func(){
                System.out.println("匿名内部类的func()");
            }
        }.func();//匿名内部类

    }
    public static void main2(String[] args) {
      OutClass.InnerClass  innerClass = new OutClass.InnerClass();
      innerClass.func();

    }
     /*public static void main1(String[] args) {
        OutClass outClass = new OutClass();
        OutClass.InnerClass inneeClass = outClass.new InnerClass();
        inneeClass.func();
    }*/
}
